ランダムフォレスト(Random Forest)
Overview
ランダムフォレストは、アンサンブル法(Ensembles, 複数の機械学習モデルを組み合わせることで、より強力なモデルを構築する手法)を用いた決定木モデルの1つです。決定木モデルの最大の問題点は訓練データに対して過剰適合してしまうことにありますが、ランダムフォレストはこの問題に対応します。
Theory
ランダムフォレストは、要するに少しずつ異なる決定木をたくさん集めたものです。個々の決定木は比較的うまく予測できているが、一部のデータに対して過剰適合してしまっているという考えに基づいています。それぞれ異なった方向に過剰適合した決定木をたくさん作れば、その結果の平均を取ることで、過剰適合を減らすことができます。
ランダムフォレストという名前は、個々の決定木が互いに異なるように、決定木の構築の過程で乱数を導入していることから付いています。ランダムフォレストに乱数を導入する方法は2つあります。決定木を作るためのデータポイントを選択する方法と、分枝テストに用いる特徴量を選択する方法です。
Coding(Classification)
cancerデータセットでモデルを構築・学習・評価する
code: Python
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)
forest = RandomForestClassifier(n_estimators=100, random_state=0)
forest.fit(X_train, y_train)
print('Accuracy on training set: {:.3f}'.format(forest.score(X_train, y_train)))
print('Accuracy on test set: {:.3f}'.format(forest.score(X_test, y_test)))
--------------------------------------------------------------------------
Accuracy on training set: 1.000
Accuracy on test set: 0.972
--------------------------------------------------------------------------
このランダムフォレストは、パラメータを全く調整していませんが、97%の精度を示しています。max_featuresパラメータや、個々の決定木に対して事前枝刈りを行うことでさらにチューニングをすることもできますが、しかし多くの場合では、ランダムフォレストはデフォルトのパラメータで十分よく機能します。
Advanced
ランダムフォレストの特徴量の重要性
決定木と同様に、ランダムフォレストでも特徴量の重要度を見ることができます。これは、個々の決定木の特徴量の重要度を平均したものです。多くの場合、ランダムフォレストによる特徴量の重要度は、個々の決定木のそれよりも信頼できます。
code: Python
def plot_feature_importances_cancer(model):
n_features = cancer.data.shape1 plt.barh(range(n_features), model.feature_importances_, align='center')
plt.yticks(np.arange(n_features), cancer.feature_names)
plt.xlabel('Feature importance')
plt.ylabel('Feature')
plot_feature_importances_cancer(forest)
https://gyazo.com/97c8d690f81b7481e44792e31f2dc758
ランダムフォレストでは、決定木の場合よりもはるかに多くの特徴量に対して0以上の重要度を与えています。ランダムフォレストを構築する際の乱数性によって、アルゴリズムは多くの可能な説明を考慮するようになるので、ランダムフォレストの結果は、個々の決定木の結果よりも広い視野で見た全体像を捉えることができます。
Summary
Merit
現在最も広く使われている機械学習手法(回帰でもクラス分類でも)
それほどパラメータチューニングをせずに使える
データのスケール変換をする必要がない
決定木の利点の多くを残したまま、決定木の欠点の一部を補っている
Demerit
詳細を理解したり、専門家でない人にもわかるように可視化するのが難しい
テキストデータなどの、非常に高次元で疎なデータに対してはうまく機能しない傾向がある → このようなデータに対しては線形モデルのほうが適している
Parameters
max_features
個々の決定木の乱数性を決定する
max_featuresが小さくなると過剰適合が低減する
一般にはデフォルト値を使うのがよい(クラス分類: max_features=sqrt(max_features), 回帰: max_features=n_features)
n_estimators
大きければ大きいほど良い